package com.quanliang.org.crawlerquanliang.core;


import com.quanliang.org.crawlerquanliang.utils.ExcelUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.*;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * ExcelFile输出文件类
 * 该类只有单线程操作,不需要考虑并发问题
 *
 * @author FYM
 * @data 2022/8/27 0:38
 */
@lombok.Data
public class ExcelFile {
    private HSSFWorkbook wb;
    //文件名
    private String fileName;
    //excel文件绝对路径
    private String fileURL;
    //创建时间
    private String createDate;
    //sheet的名称
    private String sheetName;
    //写入流
    private BufferedOutputStream fileOutputStream;

    public ExcelFile() {
        init();
        System.out.println("excel文件已初步创建成功，等待爬取数据完全写入,此时请勿打开该文件！");
    }


    /**
     * 初始化生成excel文件
     * 确定文件名、sheet、第一行title内容
     */
    @SneakyThrows
    private void init() {
        this.sheetName = "quianliang";
        this.createDate = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        this.fileName = "data_" + createDate + ".xls"; //输出格式：data_202208027000000.xls
        this.fileURL = System.getProperty("user.dir") + "\\" + fileName;

        //标题,发布时间,阅读数量,页码数,图片
        String[] title = {"title", "releaseDate", "readCount", "page", "img"};
        this.wb = ExcelUtil.initHSSFWorkbook(sheetName, title);

        //持久化初始文件至本地
        File file = new File(fileName);
        if (!file.createNewFile()) {
            System.out.println("Excel文件尝试创建失败,可能文件已存在,程序已退出");
            System.exit(0);
            return;
        }
        //启动写线程
        writeData();
    }


    /**
     * 对Excel文件写入操作
     */
    public void writeData() {
        //生产者结束并且队列中再无任务则excel结束
        new Thread(new WriteTask(wb, fileURL, wb.getSheet(sheetName)),
                "WriteExcelThread")
                .start();
    }


}
